<?php
/**
 * Cria as tabelas base no banco de dados
 * 
 * Para executar:
 *      yiic migrate
 * 
 * @author Érycson Nóbrega <egdn2004@gmail.com>
 * @see http://www.yiiframework.com/doc/api/1.1/CDbMigration
 * @see http://www.yiiframework.com/doc/api/1.1/CDbSchema#getColumnType-detail
 */
class m140726_211622_criar_tabela_base extends CDbMigration
{
    /**
     * Criar uma transaction para executar os comandos, e automaticamente 
     * executa o commit se tudo ocorrer bem.
     */
    public function safeUp()
    {
        $this->criarTabelaPerfil();
        $this->criarTabelaRecurso();
        $this->criarTabelaPermissao();
        
        $this->criarTabelaUsuario();
        $this->criarTabelaUsuarioEstagio();
        $this->criarTabelaEmpresaVagas();
//        $this->criarTabelaBanca();
//        $this->criarTabelaCurso();
    }
    
    public function criarTabelaPerfil() {
        $this->createTable('perfil', array(
            'id'     => 'pk',
            'nome'   => 'string NOT NULL',
            'pai_id' => 'int',
        ), 'ENGINE=InnoDB');
        
        $this->insert('perfil', array('nome' => 'visitante'));                      // 1 - Visitante
        $this->insert('perfil', array('nome' => 'usuario',       'pai_id' => 1));   // 2 - Usuário logado
        
        // Perfis de usuários
        $this->insert('perfil', array('nome' => 'professor',     'pai_id' => 2));   // 3
        $this->insert('perfil', array('nome' => 'aluno',         'pai_id' => 2));   // 4
        $this->insert('perfil', array('nome' => 'empresa',       'pai_id' => 2));   // 5
        
        // Administador
        $this->insert('perfil', array('nome' => 'administrador', 'pai_id' => 3));   // 6
        
        $this->addForeignKey('fk_perfil_pai', 'perfil', 'pai_id', 'perfil', 'id', 'CASCADE', 'CASCADE');
        $this->createIndex('idx_perfil_nome', 'perfil', 'nome', true);
    }
    
    public function criarTabelaRecurso() {
        $this->createTable('recurso', array(
            'id'   => 'pk',
            'nome' => 'string NOT NULL',
        ), 'ENGINE=InnoDB');
        
        $this->insert('recurso', array('nome' => 'main.*'));                    // 1
        $this->insert('recurso', array('nome' => 'usuario.index'));             // 2
        $this->insert('recurso', array('nome' => 'usuario.entrar'));            // 3
        $this->insert('recurso', array('nome' => 'usuario.sair'));              // 4
        $this->insert('recurso', array('nome' => 'administrar.aluno.*'));       // 5
        $this->insert('recurso', array('nome' => 'administrar.professor.*'));   // 6
        
        $this->createIndex('idx_recurso_nome', 'recurso', 'nome', true);
    }
    
    public function criarTabelaPermissao() {
        $this->createTable('permissao', array(
            'id'         => 'pk',
            'perfil_id'  => 'int NOT NULL',
            'recurso_id' => 'int NOT NULL',
        ), 'ENGINE=InnoDB');
        
        $this->insert('permissao', array('perfil_id' => 1, 'recurso_id' => 1 ));    // Visitante -> main.,*
        $this->insert('permissao', array('perfil_id' => 1, 'recurso_id' => 3 ));    // Visitante -> usuario.entrar
        $this->insert('permissao', array('perfil_id' => 2, 'recurso_id' => 2 ));    // Usuário -> usuario.index
        $this->insert('permissao', array('perfil_id' => 2, 'recurso_id' => 4 ));    // Usuário -> usuario.sair
        $this->insert('permissao', array('perfil_id' => 6, 'recurso_id' => 5 ));    // Admin -> administrar.aluno.*
        $this->insert('permissao', array('perfil_id' => 6, 'recurso_id' => 6 ));    // Admin -> administrar.professor.*
        
        $this->addForeignKey('fk_permissao_perfil',  'permissao', 'perfil_id',  'perfil',  'id', 'CASCADE', 'CASCADE');
        $this->addForeignKey('fk_permissao_recurso', 'permissao', 'recurso_id', 'recurso', 'id', 'CASCADE', 'CASCADE');
    }
    
    public function criarTabelaUsuario() {
        $this->createTable('usuario', array(
            'id'        => 'pk',
            'perfil_id' => 'int NOT NULL',
            
            // Autenticação
            'usuario'     => 'VARCHAR(16) NOT NULL',
            'senha'       => 'string NOT NULL',
            
            // Contato
            'email'    => 'VARCHAR(200) NOT NULL',
            'nome'     => 'string',                 // Pode ser usado apra nome da empresa ou o nome da pessoa
            'endereco' => 'string',
            'telefone' => 'int',                    // Formato: (99) 99999-9999
        ), 'ENGINE=InnoDB');
        
        // Cria um usuário admin
        $this->insert('usuario', array(
            'perfil_id' => 6,
            'usuario'   => 'admin', 
            'senha'     => password_hash('admin', PASSWORD_DEFAULT), 
            'email'     => 'admin@ifpb.edu.br', 
            'nome'      => 'Administrador',
        ));
        
        $this->createIndex('idx_usuario_usuario', 'usuario', 'usuario', true);
        $this->createIndex('idx_usuario_email', 'usuario', 'email', true);
        
        $this->addForeignKey('fk_usuario_perfil', 'usuario', 'perfil_id', 'perfil', 'id', 'CASCADE', 'CASCADE');
    }
    
    public function criarTabelaUsuarioEstagio() {
        $this->createTable('estagio_usuario', array(
            'id'          => 'pk',
            'aluno_id'    => 'int NOT NULL',
            'empresa_id'  => 'int',             // A empresa pode não estar cadastrada
            'data_inicio' => 'date',
            'data_fim'    => 'date',
        ), 'ENGINE=InnoDB');
        
        $this->addForeignKey('fk_usuarioestagio_aluno',   'estagio_usuario', 'aluno_id',   'usuario', 'id', 'CASCADE', 'CASCADE');
        $this->addForeignKey('fk_usuarioestagio_empresa', 'estagio_usuario', 'empresa_id', 'usuario', 'id', 'CASCADE', 'CASCADE');
    }
    
    public function criarTabelaEmpresaVagas() {
        $this->createTable('estagio_empresa', array(
            'id'         => 'pk',
            'empresa_id' => 'int NOT NULL',
            'funcao'     => 'string NOT NULL',
            'turno'      => 'string NOT NULL',
            'descricao'  => 'text',
        ), 'ENGINE=InnoDB');
        
        $this->addForeignKey('fk_estagioempresa_empresa', 'estagio_empresa', 'empresa_id', 'usuario', 'id', 'CASCADE', 'CASCADE');
    }

    public function safeDown()
    {
        $this->dropIndex('idx_usuario_usuario', 'usuario');
        $this->dropIndex('idx_usuario_email',   'usuario');
        
        $this->dropForeignKey('fk_usuarioestagio_aluno',   'estagio_usuario');
        $this->dropForeignKey('fk_usuarioestagio_empresa', 'estagio_usuario');
        $this->dropForeignKey('fk_estagioempresa_empresa', 'estagio_empresa');
        
        $this->dropTable('usuario');
        $this->dropTable('estagio_usuario');
        $this->dropTable('estagio_empresa');
        return true;
    }
}